package com.Cychat.doctor.controller;


import com.Cychat.commons.entity.ResultMessage;
import com.Cychat.commons.entity.pojo.Hospital;
//import com.Cychat.doctor.config.TopicMQConfig;
import com.Cychat.doctor.service.HospitalService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;

/**
 * Auther: 谢宝辉  <br/>
 * Date: 2025/11/3:17:21  <br/>
 * Description: 医院Controller
 */
@RestController
@RequestMapping("/api/doctor/hospital")
@CrossOrigin
@Slf4j
public class HospitalController {

    @Autowired
    private HospitalService hospitalService;

    @Autowired
    RabbitTemplate rabbitTemplate;

    /**
     * Description : 获取全部医院信息
     * ChangeLog : 1. 创建 (2025/11/3 17:21 [Lenovo]);
     * @auther: 谢宝辉
     * date: 2025/11/3:17:21
     * @param
     * @return null
    */
    @GetMapping("/getAllHospital")
    public ResultMessage<List<Hospital>> getAllHospital() {
        List<Hospital> allHospital = hospitalService.getAllHospital();
        return ResultMessage.success(allHospital);
    }

    /**
     * Description : 新增医院信息并发送向量化消息
     * ChangeLog : 1. 创建 (2025/11/4 17:52 [Lenovo]);
     * @auther: 谢宝辉
     * date: 2025/11/4:17:52
     * @param hospital 医院对象
     * @return null
    */
    @PostMapping("/addHospital")
    public ResultMessage<Hospital> addHospital(@RequestBody Hospital hospital) {
        // 1. 校验医院ID是否已存在
        if (hospital.getHospitalId() != null) {
            Hospital existingHospital = hospitalService.getById(hospital.getHospitalId());
            if (existingHospital != null) {
                return ResultMessage.error("医院ID已存在，请使用自动递增或指定新的ID");
            }
        }

        // 2. 校验医院名称是否已存在
        QueryWrapper<Hospital> nameQueryWrapper = new QueryWrapper<>();
        nameQueryWrapper.eq("name", hospital.getName());
        Hospital existingHospitalByName = hospitalService.getOne(nameQueryWrapper);
        if (existingHospitalByName != null) {
            return ResultMessage.error("医院名称已存在，请勿重复添加");
        }

        // 3. 存入MySQL（建议加事务，确保原子性）
        boolean saveSuccess = hospitalService.save(hospital);
        if (!saveSuccess) {
            return ResultMessage.error("新增医院失败：数据库保存失败");
        }
        return ResultMessage.success(hospital);

//        try {
//            // 4. MySQL保存成功，发送消息到RabbitMQ主题交换机
//            // 发送消息（通过交换机+路由键，而非直接发队列）使用配置类的常量，明确交换机和路由键
//            rabbitTemplate.convertAndSend(
//                TopicMQConfig.VECTOR_TOPIC_EXCHANGE,  // 通用交换机（常量）
//                TopicMQConfig.HOSPITAL_VECTOR_ROUTING_KEY,  // 医院路由键（常量）
//                hospital
//            );
//
//            // 5. 生产者确认回调（可选，增强可靠性）
//            rabbitTemplate.setConfirmCallback((correlation, ack, cause) -> {
//                if (ack) {
//                    System.out.println("消息投递成功：" + correlation.getId());
//                } else {
//                    System.err.println("消息投递失败：" + cause + "，消息ID：" + correlation.getId());
//                    // 这里可以加补偿逻辑：如记录失败日志，后续手动重试
//                }
//            });
//
//            return ResultMessage.success( hospital); // 保存成功返回成功结果
//        } catch (Exception e) {
//            // 消息发送失败：这里可以选择回滚MySQL（根据业务需求）
//            // 注意：若已返回成功给前端，不建议回滚，可通过日志+定时任务重试
//            System.err.println("消息发送失败：" + e.getMessage());
//            return ResultMessage.error("新增医院成功，但向量化消息发送失败，请稍后重试");
//        }
    }

    /**
     * Description : 更新医院信息
     * ChangeLog : 1. 创建 (2025/11/6 10:29 [Lenovo]);
     * @auther: 谢宝辉
     * date: 2025/11/6:10:29
     * @param hospital 医院对象
     * @return null
    */
     @PutMapping("/updateHospital")
    public ResultMessage<Hospital> updateHospital(@RequestBody Hospital hospital) {
        // 1. 校验医院ID是否存在
        if (hospital.getHospitalId() == null) {
            return ResultMessage.error("医院ID不能为空");
        }

        // 2. 校验医院名称是否已存在（排除当前医院）
        QueryWrapper<Hospital> nameQueryWrapper = new QueryWrapper<>();
        nameQueryWrapper.eq("name", hospital.getName());
        nameQueryWrapper.ne("hospital_id", hospital.getHospitalId());
        Hospital existingHospitalByName = hospitalService.getOne(nameQueryWrapper);
        if (existingHospitalByName != null) {
            return ResultMessage.error("医院名称已存在，请勿重复添加");
        }

        // 3. 更新MySQL
        boolean updateSuccess = hospitalService.updateById(hospital);
        if (!updateSuccess) {
            return ResultMessage.error("更新医院失败：数据库更新失败");
        }
        return ResultMessage.success(hospital);
    }

    /**
     * Description : 删除医院信息
     * ChangeLog : 1. 创建 (2025/11/6 10:30 [Lenovo]);
     * @auther: 谢宝辉
     * date: 2025/11/6:10:30
     * @param hospitalId 医院ID
     * @return null
    */
    @DeleteMapping("/deleteHospital/{hospitalId}")
    public ResultMessage<Void> deleteHospital(@PathVariable("hospitalId") Long hospitalId) {
        // 1. 校验医院ID是否存在
        Hospital hospital = hospitalService.getById(hospitalId);
        if (hospital == null) {
            return ResultMessage.error("医院ID不存在");
        }

        // 2. 删除MySQL
        boolean deleteSuccess = hospitalService.removeById(hospitalId);
        if (!deleteSuccess) {
            return ResultMessage.error("删除医院失败：数据库删除失败");
        }
        return ResultMessage.success();
    }


}
